package dao;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;

import bo.ProdutoFornecedor;
import exception.DataException;
import exception.DatabaseConnectException;
import exception.EmptyResultException;

public class ProdutoFornecedorDAO {

	public ArrayList<ProdutoFornecedor> consultaPorIdProduto(Integer id)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException {

		ArrayList<ProdutoFornecedor> ProdutoFornecedores = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT produto_fornecedor.id_produto, produto_fornecedor.id_fornecedor, produto_fornecedor.valor_compra, produto_fornecedor.dt_atualizacao "
									+ "FROM produto_fornecedor WHERE produto_fornecedor.id_produto = ? ORDER BY produto_fornecedor.id_produto;");

			preparedStatement.setInt(1, id);

			resultSet = preparedStatement.executeQuery();

			if (!resultSet.next()) {
				throw new EmptyResultException();
			} else {
				ProdutoFornecedores = new ArrayList<ProdutoFornecedor>();
				while (resultSet.next()) {
					ProdutoFornecedor produtoFornecedor = new ProdutoFornecedor();
					produtoFornecedor.setIdProduto(resultSet.getInt(1));
					produtoFornecedor.setIdFornecedor(resultSet.getInt(2));
					produtoFornecedor.setValorCompra(resultSet.getFloat(3));
					produtoFornecedor.setDtAtualizacao(resultSet.getDate(4));
					ProdutoFornecedores.add(produtoFornecedor);
				}
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			preparedStatement.close();
			resultSet.close();
		}

		return ProdutoFornecedores;
	}

	public ArrayList<ProdutoFornecedor> consultaPorIdFornecedor(Integer id)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException {

		ArrayList<ProdutoFornecedor> ProdutoFornecedores = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT produto_fornecedor.id_produto, produto_fornecedor.id_fornecedor, produto_fornecedor.valor_compra, produto_fornecedor.dt_atualizacao "
									+ "FROM produto_fornecedor WHERE produto_fornecedor.id_fornecedor = ? ORDER BY produto_fornecedor.id_fornecedor;");

			preparedStatement.setInt(1, id);

			resultSet = preparedStatement.executeQuery();

			if (!resultSet.next()) {
				throw new EmptyResultException();
			} else {
				ProdutoFornecedores = new ArrayList<ProdutoFornecedor>();
				while (resultSet.next()) {
					ProdutoFornecedor produtoFornecedor = new ProdutoFornecedor();
					produtoFornecedor.setIdProduto(resultSet.getInt(1));
					produtoFornecedor.setIdFornecedor(resultSet.getInt(2));
					produtoFornecedor.setValorCompra(resultSet.getFloat(3));
					produtoFornecedor.setDtAtualizacao(resultSet.getDate(4));
					ProdutoFornecedores.add(produtoFornecedor);
				}
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			preparedStatement.close();
			resultSet.close();
		}

		return ProdutoFornecedores;
	}

	public void incluir(ProdutoFornecedor produtoFornecedor)
			throws DataException, DatabaseConnectException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"INSERT INTO produto_fornecedor (id_produto, id_fornecedor, valor_compra, dt_atualizacao) "
									+ " VALUES (nextval('seqprod_fornec'), ?, ?, ?, ?)");

			preparedStatement.setInt(1, produtoFornecedor.getIdProduto());
			preparedStatement.setInt(2, produtoFornecedor.getIdFornecedor());
			preparedStatement.setFloat(3, produtoFornecedor.getValorCompra());
			if (produtoFornecedor.getDtAtualizacao() != null) {
				preparedStatement.setDate(4, new Date(produtoFornecedor
						.getDtAtualizacao().getTime()));
			} else {
				preparedStatement.setNull(4, Types.DATE);
			}

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.INSERT);
		}
	}

	public void alterar(ProdutoFornecedor produtoFornecedor)
			throws DataException, DatabaseConnectException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"UPDATE produto_fornecedor "
									+ "SET produto_fornecedor.id_produto = ?, produto_fornecedor.id_fornecedor = ?, produto_fornecedor.valor_compra = ?, produto_fornecedor.dt_atualizacao = ?");

			preparedStatement.setInt(1, produtoFornecedor.getIdProduto());
			preparedStatement.setInt(2, produtoFornecedor.getIdFornecedor());
			preparedStatement.setFloat(3, produtoFornecedor.getValorCompra());
			if (produtoFornecedor.getDtAtualizacao() != null) {
				preparedStatement.setDate(4, new Date(produtoFornecedor
						.getDtAtualizacao().getTime()));
			} else {
				preparedStatement.setNull(4, Types.DATE);
			}

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.UPDATE);
		}
	}

	public void excluir(Integer idProduto, Integer idFornecedor)
			throws DataException, DatabaseConnectException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"DELETE FROM produto_fornecedor WHERE produto_fornecedor.id_produto = ? AND produto_fornecedor.id_fornecedor = ?");

			preparedStatement.setInt(1, idProduto);
			preparedStatement.setInt(2, idFornecedor);

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.DELETE);
		}
	}

}
